import { Path } from '@antv/x6'

/**
 * 自定义平滑连接器
 * 基于algo-connector的思路，实现更优雅的贝塞尔曲线连接
 */
export const registerCustomConnector = (Graph) => {
  Graph.registerConnector(
    'custom-smooth-connector',
    (sourcePoint, targetPoint, routePoints, options) => {
      const { source: s, target: e } = { source: sourcePoint, target: targetPoint }
      
      // 基础偏移量，控制曲线起始和结束的直线段长度
      const offset = options?.offset || 4
      
      // 计算Y轴距离，用于动态调整曲线弯曲程度
      const deltaY = Math.abs(e.y - s.y)
      const deltaX = Math.abs(e.x - s.x)
      
      // 根据距离计算控制点偏移量
      // 距离越大，曲线越弯曲
      const controlY = Math.floor((deltaY / 3) * 2)
      const controlX = Math.min(deltaX / 4, 50) // 限制X方向的最大偏移
      
      // 计算贝塞尔曲线的控制点
      let v1, v2
      
      if (deltaX > deltaY) {
        // 水平方向距离较大时，使用水平优化的控制点
        v1 = { 
          x: s.x + (s.x < e.x ? controlX : -controlX), 
          y: s.y + offset + controlY 
        }
        v2 = { 
          x: e.x + (s.x < e.x ? -controlX : controlX), 
          y: e.y - offset - controlY 
        }
      } else {
        // 垂直方向距离较大时，使用垂直优化的控制点
        v1 = { 
          x: s.x + (s.x < e.x ? controlX / 2 : -controlX / 2), 
          y: s.y + offset + controlY 
        }
        v2 = { 
          x: e.x + (s.x < e.x ? -controlX / 2 : controlX / 2), 
          y: e.y - offset - controlY 
        }
      }
      
      // 生成SVG路径
      const path = `
        M ${s.x} ${s.y}
        L ${s.x} ${s.y + (s.y < e.y ? offset : -offset)}
        C ${v1.x} ${v1.y} ${v2.x} ${v2.y} ${e.x} ${e.y + (s.y < e.y ? -offset : offset)}
        L ${e.x} ${e.y}
      `
      
      return Path.normalize(path)
    },
    true // 允许覆盖已存在的连接器
  )
}

/**
 * 注册增强版平滑连接器
 * 支持更多自定义参数
 */
export const registerEnhancedConnector = (Graph) => {
  Graph.registerConnector(
    'enhanced-smooth-connector',
    (sourcePoint, targetPoint, routePoints, options = {}) => {
      const { source: s, target: e } = { source: sourcePoint, target: targetPoint }
      
      // 可配置参数
      const {
        offset = 6,           // 起始直线段长度
        curvature = 0.6,      // 曲线弯曲程度 (0-1)
        minControl = 20,      // 最小控制点偏移
        maxControl = 80       // 最大控制点偏移
      } = options
      
      const deltaY = Math.abs(e.y - s.y)
      const deltaX = Math.abs(e.x - s.x)
      const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY)
      
      // 根据距离和曲率计算控制点偏移
      const controlOffset = Math.max(
        minControl,
        Math.min(maxControl, distance * curvature * 0.3)
      )
      
      // 智能控制点计算
      const isHorizontal = deltaX > deltaY * 1.5
      const isVertical = deltaY > deltaX * 1.5
      
      let v1, v2
      
      if (isHorizontal) {
        // 水平布局优化
        const midX = (s.x + e.x) / 2
        v1 = { x: midX - controlOffset * 0.3, y: s.y }
        v2 = { x: midX + controlOffset * 0.3, y: e.y }
      } else if (isVertical) {
        // 垂直布局优化
        const midY = (s.y + e.y) / 2
        v1 = { x: s.x, y: midY - controlOffset * 0.3 }
        v2 = { x: e.x, y: midY + controlOffset * 0.3 }
      } else {
        // 对角线布局
        const xDir = s.x < e.x ? 1 : -1
        const yDir = s.y < e.y ? 1 : -1
        
        v1 = {
          x: s.x + xDir * controlOffset * 0.5,
          y: s.y + yDir * controlOffset * 0.3
        }
        v2 = {
          x: e.x - xDir * controlOffset * 0.5,
          y: e.y - yDir * controlOffset * 0.3
        }
      }
      
      // 生成平滑的贝塞尔曲线路径
      const path = `
        M ${s.x} ${s.y}
        C ${v1.x} ${v1.y} ${v2.x} ${v2.y} ${e.x} ${e.y}
      `
      
      return Path.normalize(path)
    },
    true
  )
}